#include <allegro.h>
#include "game.hpp"
#include "main.hpp"
#include <cmath>
#include <ctime>

#include <iostream>

cGame * game;//wskaznik na obiekt gry

int main()
{
    game = new cGame(800, 640);//tworzenie obiektu gry rozmiary 800x640
    game->installMouse();//wlaczenie myszy

    ///TYMCZASOWE DODANIE ITEMKOW DO EQ I DODANIE ITEMKOW NA MAPE I DIALOGOW
    if (true)
    {
        game->hero->eq->itemAdd(0, 1000);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(1, 1);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(2, 2);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(3, 1);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(4, 3);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(5, 2);//dodajemy 5 itemkow o ID == 0
        game->hero->eq->itemAdd(6, 1);//dodajemy 5 itemkow o ID == 6
        game->hero->eq->itemAdd(7, 3);//dodajemy 5 itemkow o ID == 6

        game->map->addItem(10, 35, 0, 1);//dodajemy na pozycje 10, 35 itemek o ID == 0 w ilosci 1
        game->map->addItem(100, 111, 1, 5);//dodajemy na pozycje 10, 35 itemek o ID == 0 w ilosci 1
        game->map->addItem(220, 50, 6, 1);//dodajemy na pozycje 10, 35 itemek o ID == 0 w ilosci 1
        game->map->addItem(30, 30, 0, 3);//dodajemy na pozycje 10, 35 itemek o ID == 0 w ilosci 1

        game->addNPC(135, 135, M_PI, "blacksmith.bmp");
        game->NPC[0]->eq->itemAdd(0, 1000);
        game->NPC[0]->eq->itemAdd(1, 3);
        game->NPC[0]->eq->itemAdd(2, 2);


        game->NPC[0]->addSubDialog(game->NPC[0]->dialog, "Witaj, moge Ci jakos pomoc?", "W sama pore podrozniku! Czekam juz 2 dni na zolnierzy ksiecia Jana, a oni pewnie dalej chleja...");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0], "Co mam zrobic?", "Zabij te przeklete wilki! Nie moge przez nie spac, bo musze pilnowac moich owieczek.");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[0], "Wchodze w to!", "Dziekuje Ci!!! Wilki znajdziesz na zachodzie.");
                    game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[0]->subDialog[0], "Wroc", "");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[0], "W zyciu! To niebezpieczne!!!", "Masz racje, niepotrzebnie Cie w to wciagalem");
                    game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[0]->subDialog[1], "Wroc", "");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[0], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0], "Eee... to pewnie robota dla wojaka, odpadam.", "Jak chcesz, ale wiedz, ze bardzo bym mi pomogl");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0]->subDialog[1], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[0], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog, "Jak tam praca w polu?", "Zle... Wilki ciagle nekaja moje owieczki, co ja teraz poczne?");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1], "Moze Ci pomoc?", "Ooo... Bylbym bardzo wdzieczny! Dziekuje, zaplace Ci jak je zabijesz, wez moja siekiere, na pewno Ci sie przyda");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1]->subDialog[0], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1], "Aha... fajnie", "No nie?");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1]->subDialog[1], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1], "Pomoge Ci za 1000 szt. zlota!", "Co?! Nie mam tyle... Moze sam ksiaze Jan ma tyle, ale na pewno nie taki biedny rolnik jak ja...");
                game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1]->subDialog[2], "Wroc", "");
            game->NPC[0]->addSubDialog(game->NPC[0]->dialog->subDialog[1], "Wroc", "");
        game->NPC[0]->addSubDialog(game->NPC[0]->dialog, "Handel", "");
        game->NPC[0]->addSubDialog(game->NPC[0]->dialog, "Koniec", "");

        game->log->addMessage("Start Game!!!");


        game->addMoob(0, 300, 600, MOOB_TYPE_PEACEFUL);
        game->addMoob(0, 300, 500, MOOB_TYPE_PEACEFUL);
        game->addMoob(0, 400, 500, MOOB_TYPE_PEACEFUL);
        game->addMoob(0, 400, 600, MOOB_TYPE_PEACEFUL);
        game->addMoob(0, 350, 550, MOOB_TYPE_PEACEFUL);
    }
    ///KONIEC TYMCZASOWEGO

    ///GŁOWNA PĘTLA GRY
    while (game->isRunning() && !key[KEY_ESC])
    {
        ///AKTUALIZACJA CZASU
        game->timeActualisation();//aktualizacja czasu gry

        game->checkKeys();


        if (key[KEY_K] && game->pause==0 )
        {

            game->minigame->drawgame(game->bufor,100);
        }


        if (!game->pause)
            game->hero->checkMouse(mouse_x, mouse_y, game->MOUSE_FREE, game->map, game->show, &game->NPC);//sprawdzamy wejscie myszki

        //JESLI MAMY WLACZONE EQ
        if (game->hero->eq->isDrawing)
        {
            game->hero->eq->manage(game->MOUSE_FREE);
        }

        //JESLI GRA NIE JEST ZAPAUZOWANA
        while(game->accumulator > game->TIME_STEP)
        {
            if (!game->pause)
            {
                game->hero->update(game->show, game->map, game->bufor, game->MOUSE_FREE);//update postaci
                game->log->actual();
                //UPDATE MOOBKOW, NPC, CZEGOKOLWIEK...
            }

            game->accumulator -= game->TIME_STEP;
        }

        game->draw();//rysuje całą grę

        rest(15);
    }

    delete game;//kasujemy obiekt game

    return 0;
}
END_OF_MAIN();

//zamieniamy 1 kolor w bitmapie na drugi, bardzo przydatne do kolorowania postaci, ich EQ, twarzy itp ;]
void colorToColor(BITMAP * &b, int col1, int col2)
{
    for (int x = 0; x < b->w; x++)
    {
        for (int y = 0; y < b->h; y++)
        {
            if (_getpixel32(b, x, y) == col1)//pobieramy pixel
                _putpixel32(b, x, y, col2);//i go zmieniamy
        }
    }
}

//zamiana kątu w stopniach na kąt w radianach
float ator(float angle)
{
    return (angle * 3.1415926535) / 180.0f;
}

//zamiana kąta w radianach na kąt w stopniach
float rtoa(float radian)
{
    return (radian * 180.0f) / 3.1415926535;
}

//odległość między punktami w układize współrzędnych
float disBetweenPoint(float x1, float y1, float x2, float y2)
{
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}

//obliczmy kąt pomiędzyśrodkiem układu współrzędnych, a punktami x i y
float countAngle(float x, float y)
{
    if (x == 0 && y == 0) return 0;

    int quarter;

    if      (x > 0 && y <= 0)  quarter = 1;
    else if (x <= 0 && y <= 0) quarter = 2;
    else if (x <= 0 && y > 0)  quarter = 3;
    else if (x > 0 && y > 0)   quarter = 4;

    float angle = atan(y/x);

    switch (quarter)
    {
        case 1: angle = -angle; break;
        case 2: angle = M_PI - angle;  break;
        case 3: angle = M_PI - angle; break;
        case 4: angle = 2 * M_PI - angle;  break;
    }

    if (x == 0) angle = (y > 0 ? 1.5 * M_PI : M_PI / 2);

    return angle;
}

//do wczytywania nazw moobkow, itemkow NPC (nazwy beda takie:nazwa_itema_albo_mooba), zamienia _ na spacje)
void repairName(std::string &name)
{
    for (int i = 0; i < name.length(); i++)
        if (name[i] == '_') name[i] = ' ';
}

void drawGame()
{
    //czyscimy bitmape
    clear_to_color(game->bufor, 0x000000);

    //rysujemy mape
    game->map->draw(game->bufor, game->show);

    //rysujemy NPC
    for (int i = 0; i < game->NPC.size(); i++)
    {
        game->NPC[i]->draw(game->bufor, game->show, game->map->shift, game->map->fogOfWar, game->map->fogOn);
    }

    //rysujemy logger
    game->log->draw(game->bufor);

    //rysujemy bohatera
    game->hero->draw(game->bufor, game->show, game->map->shift);
}
